home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / ARMLINUX / MAIL / 9805 / 000172_bug-hurd-request@gnu.org _Mon May 25 22:39:33 1998.msg < prev    next >
Internet Message Format  |  1998-06-02  |  5KB

  1. Return-Path: <bug-hurd-request@gnu.org>
  2. Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21])
  3.     by odie.barnet.ac.uk (8.8.6/8.8.6) with ESMTP id WAA20517
  4.     for <willy@odie.barnet.ac.uk>; Mon, 25 May 1998 22:39:31 +0100
  5. Received: by mescaline.gnu.org (8.8.5/8.6.12GNU) id RAA18782; Mon, 25 May 1998 17:39:31 -0400
  6. Resent-Date: Mon, 25 May 1998 17:39:31 -0400
  7. Received: from bambam.m-tech.ab.ca by mescaline.gnu.org (8.8.5/8.6.12GNU) with ESMTP id RAA18184 for <bug-hurd@gnu.org>; Mon, 25 May 1998 17:28:21 -0400
  8. Received: from trick.profitpress.com (bambam-r1 [10.0.2.1]) by bambam.m-tech.ab.ca (8.8.5/8.6.9) with SMTP id PAA25764 for <bug-hurd@gnu.org>; Mon, 25 May 1998 15:21:42 -0600
  9. Received: (qmail 19757 invoked by uid 1001); 25 May 1998 21:32:46 -0000
  10. To: Roland McGrath <roland@frob.com>
  11. Cc: Ulrich Drepper <drepper@gnu.org>,
  12.         GNU Libc Alpha Testers <libc-alpha@cygnus.com>,
  13.         Hurd Bug List <bug-hurd@gnu.org>
  14. Subject: Re: glibc-19980524: invalid use of GCC's `transparent union'
  15. References: <199805251700.NAA08873@baalperazim.frob.com>
  16. X-Attribution:  Gord
  17. Mime-Version: 1.0 (generated by tm-edit 7.106)
  18. Content-Type: text/plain; charset=US-ASCII
  19. From: Gordon Matzigkeit <gord@m-tech.ab.ca>
  20. Date: 25 May 1998 15:32:45 -0600
  21. In-Reply-To: Roland McGrath's message of Mon, 25 May 1998 13:00:32 -0400
  22. Message-ID: <864syeox36.fsf@trick.profitpress.com>
  23. Lines: 97
  24. X-Mailer: Gnus v5.5/Emacs 20.2
  25. Resent-Message-ID: <"OeGZu3.0.IS4.-9UQr"@mescaline.gnu.org>
  26. Resent-From: bug-hurd@gnu.org
  27. X-Mailing-List: <bug-hurd@gnu.org> archive/latest/67
  28. X-Loop: bug-hurd@gnu.org
  29. Precedence: list
  30. Resent-Sender: bug-hurd-request@gnu.org
  31. Status: RO
  32.  
  33. Hi!
  34.  
  35. >>>>> Roland McGrath writes:
  36.  
  37.  RM> That is not correct.  The entire purpose of `transparent_union'
  38.  RM> is for this hack, and the purpose of the hack is exactly that
  39.  RM> such redeclarations will work without an error.
  40.  
  41. I disagree, and believe that it is a good idea to give an error for
  42. such redeclarations.
  43.  
  44.  RM> If the boneheads broke this in GCC again, either it has to get
  45.  RM> fixed or we have to just punt this feature entirely and break all
  46.  RM> programs that use `union wait'.
  47.  
  48. It may very well be that `transparent_union' does not have the same
  49. semantics as when it was originally implemented, but I believe it is
  50. both simpler than the original semantics, and just as functional.
  51.  
  52. As far as I can tell, you are complaining because it is not possible
  53. to do:
  54.  
  55. typedef union
  56.   {
  57.     union wait *__uptr;
  58.     int *__iptr;
  59.   } __WAIT_STATUS __attribute__ ((__transparent_union__));
  60.  
  61. /* Declaration */
  62. extern __pid_t __wait __P ((__WAIT_STATUS __stat_loc));
  63.  
  64. /* Definition */
  65. __pid_t
  66. __wait (int *__stat_loc)
  67. /* GCC complains about differing types in __wait's signature */
  68. {
  69.   /* some expression involving an int *. */
  70.   return *__stat_loc = 0;
  71. }
  72.  
  73.  
  74. Now, I suggest that the above sequence of code is in bad style.  The
  75. definition of __wait should use __WAIT_STATUS as its argument type.
  76. The GCC implementors seem to agree with me.
  77.  
  78. So, my patch changes libc to do something like the following, in line
  79. with the example in the GCC manual (*Note (gcc)Type Attributes::):
  80.  
  81. [omitting some hairy #if blocks...]
  82. #  define __WAIT_PTR(stat_loc)    ((stat_loc).__iptr)
  83. [...]
  84. /* Definition */
  85. __pid_t
  86. __wait (__WAIT_STATUS __stat_loc)
  87. {
  88.   return *__WAIT_PTR (stat_loc) = 0;
  89. }
  90.  
  91.  
  92. How many packages both #include libc's <sys/wait.h> *and* define their
  93. own __wait function.  I would assert that there are no such packages,
  94. except libc itself.  Even if there *are* packages who do this, then it
  95. is certainly no inconvenience for them to use the macros I have
  96. supplied.
  97.  
  98. But, that's only half the story (otherwise, there would be no reason
  99. to use a transparent union at all).  The macros I define are fine for
  100. smart implementors of wait, but what about naive users of wait?
  101.  
  102. The transparent_union allows them to do:
  103.  
  104. {
  105.   union wait wu;
  106.   int wi;
  107.   float wf;
  108.   wait (&wu);
  109.   wait (&wi);
  110.   wait (&wf);
  111. }
  112.  
  113. causing GCC to warn about typecasts only on the last `wait' call, even
  114. though to the naked eye it appears as if at least one of the other two
  115. `wait' calls needs a typecast.
  116.  
  117. I believe that this behaviour is exactly the intention of the original
  118. `transparent_union' flag, and that allowing different function
  119. prototypes is both confusing and unnecessary, and therefore
  120. undesirable.
  121.  
  122. So, please have another look at my patch.  It implements the above
  123. semantics, and makes them obvious to a reader of the libc code.
  124.  
  125. Thanks,
  126.  
  127. -- 
  128. Gordon Matzigkeit   \ Proudly running pieces of the GNU operating system.
  129. gord@profitpress.com \ Jacques Cousteau loved programming in assembler.